#include "serialserver.h"

SerialServer::SerialServer()
{
    m_serial = new QSerialPort(this);
}

SerialServer::~SerialServer() {
    closeSerialPort();
}

bool SerialServer::openSerialPort(const QString &portName, unsigned int baudRate, unsigned char dataBits, unsigned char parity, unsigned char stopBits) {
    if (m_serial->isOpen()) {
        return true;
    }

    m_serial->setPortName(portName);
    m_serial->setBaudRate(baudRate);
    m_serial->setDataBits(static_cast<QSerialPort::DataBits>(dataBits));
    m_serial->setParity(static_cast<QSerialPort::Parity>(parity));
    m_serial->setStopBits(static_cast<QSerialPort::StopBits>(stopBits));
    m_serial->setFlowControl(QSerialPort::NoFlowControl);

    if (m_serial->open(QIODevice::ReadWrite)) {
        connect(m_serial, &QSerialPort::readyRead, this, &SerialServer::ReceviceSerialData);
        return true;
    } else {
        return false;
    }
}

void SerialServer::closeSerialPort() {
    if (m_serial->isOpen()) {
        m_serial->close();
    }
}

bool SerialServer::isSerialPortOpen() const {
    return m_serial->isOpen();
}


void SerialServer::ReceviceSerialData()
{
    // 获取串口接收到的数据
    QByteArray data = m_serial->readAll();

    if (!data.isEmpty()) {

        m_DataBuf.append(data);         // 将接收到的数据追加到缓冲区
        int nBufLen = m_DataBuf.size(); // 获取当前缓冲区中的数据长度

        // 如果数据长度不足10，则返回，继续等待接收
//        if (nBufLen < 10) {
//            return;
//        }

        // 如果长度大于等于10，则处理所有的数据（不固定字节数）
        QString hexData;
        for (int i = 0; i < m_DataBuf.size(); ++i) {
            hexData.append(QString::asprintf("0x%02X ", static_cast<uint8_t>(m_DataBuf[i]))); // 将数据转换为16进制格式
        }
        qDebug() << "接收数据(长度大于等于10):" << hexData << QThread::currentThread();

        // 发送接收到的数据到GUI窗口
        emit serialDataReceivedReady(m_DataBuf);

        // 清空缓冲区，准备接收新的数据
        m_DataBuf.clear();
    }
}


void SerialServer::SendSerialData(const QByteArray &data)
{
    if (m_serial->isOpen()) {
        m_serial->write(data);  // 接收GUI数据并发送
#if 1 \
    // 发送数据打印
        QString hexData;
        for (int i = 0; i < data.size(); ++i) {
            hexData.append(QString::asprintf("0x%02X ", static_cast<uint8_t>(data[i])));
        }
        qDebug() << "SEND(HEX):" << hexData << QThread::currentThread();
#endif
        qDebug() << "SEND(HEX): " << data.toHex().toUpper() << QThread::currentThread();
    }
}

